package utils

import (
	"crypto/md5"
	"fmt"
	"mime"
	"path/filepath"
	"strings"
	"time"

	"github.com/disintegration/imaging"
)

// GetFileType 根据文件扩展名判断文件类型
func GetFileType(fileName string) string {
	ext := filepath.Ext(fileName)
	switch strings.ToLower(ext) {
	case ".jpg", ".jpeg", ".png", ".gif", ".bmp":
		return "image"
	case ".pdf":
		return "document"
	case ".doc", ".docx":
		return "word"
	case ".xls", ".xlsx":
		return "excel"
	case ".ppt", ".pptx":
		return "powerpoint"
	default:
		return "other"
	}
}

// IsImage 判断文件是否为图片类型
func IsImage(filename string) bool {
	ext := filepath.Ext(filename)
	switch strings.ToLower(ext) {
	case ".jpg", ".jpeg", ".png", ".gif", ".bmp":
		return true
	default:
		return false
	}
}

// GenerateThumbnails 生成图片的缩略图（小图和中图）
func GenerateThumbnails(filePath string) (string, string, error) {
	// 打开图片文件
	img, err := imaging.Open(filePath)
	if err != nil {
		return "", "", err
	}

	// 生成小图（100x100）
	smallImgPath := filepath.Dir(filePath) + "/small_" + filepath.Base(filePath)
	smallImg := imaging.Resize(img, 100, 100, imaging.Lanczos)          // 添加滤波器
	err = imaging.Save(smallImg, smallImgPath, imaging.JPEGQuality(85)) // 使用正确的编码选项
	if err != nil {
		return "", "", err
	}

	// 生成中图（500x500）
	mediumImgPath := filepath.Dir(filePath) + "/medium_" + filepath.Base(filePath)
	mediumImg := imaging.Resize(img, 500, 500, imaging.Lanczos)           // 添加滤波器
	err = imaging.Save(mediumImg, mediumImgPath, imaging.JPEGQuality(85)) // 使用正确的编码选项
	if err != nil {
		return "", "", err
	}

	return smallImgPath, mediumImgPath, nil
}

// GenerateUniqueFileName 生成唯一文件名，基于时间戳和 MD5 哈希
func GenerateUniqueFileName(originalName string) string {
	ext := filepath.Ext(originalName)
	baseName := strings.TrimSuffix(originalName, ext)
	hash := md5.Sum([]byte(baseName + time.Now().String()))
	return fmt.Sprintf("%x%s", hash, ext)
}

// GetFileName 从完整路径中提取文件名
func GetFileName(fullPath string) string {
	return filepath.Base(fullPath)
}

// GetMime 根据文件名获取 MIME 类型
func GetMime(fileName string) string {
	ext := filepath.Ext(fileName)
	return mime.TypeByExtension(ext)
}
